--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_telephone_audio_profiles.py
Displaying Raw • Download
tests/backend/test_telephone_audio_profiles.py dev (af76f09d) Text, 4.72 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Telephone audio profile selection and Codec2 readiness."""
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787pytest
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787telephone_manager Tff7b72import Te6edf3TelephoneManager
Te6edf3pytestTff7b72.Td2a8ffimportorskipTb4b4b4(Ta5d6ff"Ta5d6ffLXSTTa5d6ff"Tb4b4b4)
Tff7b72from T7ee787LXSTT7ee787.T7ee787PrimitivesT7ee787.T7ee787Telephony Tff7b72import Te6edf3Profiles
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8fftmTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3TelephoneManagerTb4b4b4(Te6edf3identityTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3managerTff7b72.Td2a8fftelephone Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3managerTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffbusy Tff7b72= Tff7b72False
Te6edf3managerTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffcall_status Tff7b72= T79c0ff3
Te6edf3managerTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffactive_call Tff7b72= Tff7b72None
Te6edf3managerTff7b72.Td2a8ff_path_poll_interval_s Tff7b72= T79c0ff0.005
Te6edf3managerTff7b72.Td2a8ff_path_retry_interval_s Tff7b72= T79c0ff0.01
Te6edf3managerTff7b72.Td2a8ff_status_poll_interval_s Tff7b72= T79c0ff0.01
Tff7b72return Te6edf3manager
Tff7b72def Td2a8fftest_resolve_invalid_profile_falls_back_to_defaultTb4b4b4(Te6edf3tmTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3tmTff7b72.Td2a8ffresolve_audio_profile_idTb4b4b4(T79c0ff2Tb4b4b4) Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffDEFAULT_PROFILE
Tff7b72assert Te6edf3tmTff7b72.Td2a8ffresolve_audio_profile_idTb4b4b4(T79c0ff999Tb4b4b4) Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffDEFAULT_PROFILE
Tff7b72def Td2a8fftest_resolve_codec2_profile_when_availableTb4b4b4(Te6edf3tmTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3TelephoneManagerTb4b4b4, Ta5d6ff"Ta5d6ffcodec2_availableTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72assert Tb4b4b4(
Te6edf3tmTff7b72.Td2a8ffresolve_audio_profile_idTb4b4b4(Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_LOWTb4b4b4)
Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_LOW
Tb4b4b4)
Tff7b72def Td2a8fftest_resolve_codec2_profile_falls_back_when_unavailableTb4b4b4(Te6edf3tmTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3TelephoneManagerTb4b4b4, Ta5d6ff"Ta5d6ffcodec2_availableTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72assert Tb4b4b4(
Te6edf3tmTff7b72.Td2a8ffresolve_audio_profile_idTb4b4b4(Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_ULTRA_LOWTb4b4b4)
Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffDEFAULT_PROFILE
Tb4b4b4)
Tff7b72def Td2a8fftest_apply_preferred_profile_stores_without_idle_switchTb4b4b4(Te6edf3tmTb4b4b4)Tb4b4b4:
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffcall_status Tff7b72= T79c0ff3
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffactive_call Tff7b72= Tff7b72None
Te6edf3resolved Tff7b72= Te6edf3tmTff7b72.Td2a8ffapply_preferred_profileTb4b4b4(Te6edf3ProfilesTff7b72.Td2a8ffQUALITY_HIGHTb4b4b4)
Tff7b72assert Te6edf3resolved Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffQUALITY_HIGH
Tff7b72assert Te6edf3tmTff7b72.Td2a8ffpreferred_profile_id Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffQUALITY_HIGH
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffswitch_profileTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_apply_preferred_profile_switches_when_establishedTb4b4b4(Te6edf3tmTb4b4b4)Tb4b4b4:
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffcall_status Tff7b72= T79c0ff6
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffactive_call Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3tmTff7b72.Td2a8ffapply_preferred_profileTb4b4b4(Te6edf3ProfilesTff7b72.Td2a8ffQUALITY_HIGHTb4b4b4)
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffswitch_profileTff7b72.Td2a8ffassert_called_once_withTb4b4b4(Te6edf3ProfilesTff7b72.Td2a8ffQUALITY_HIGHTb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_initiate_passes_preferred_profile_to_lxst_callTb4b4b4(Te6edf3tmTb4b4b4)Tb4b4b4:
Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffaaTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)
Te6edf3tmTff7b72.Td2a8ffpreferred_profile_id Tff7b72= Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_LOW
Te6edf3seen Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72def Td2a8ffcapture_callTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3profileTff7b72=Tff7b72NoneTb4b4b4, Te6edf3modeTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3seenTb4b4b4[Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3identity
Te6edf3seenTb4b4b4[Ta5d6ff"Ta5d6ffprofileTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3profile
Te6edf3seenTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3mode
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffcall_status Tff7b72= T79c0ff0
Te6edf3tmTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffcallTff7b72.Td2a8ffside_effect Tff7b72= Te6edf3capture_call
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.telephone_manager.RNS.Identity.recallTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.telephone_manager.RNS.Transport.has_pathTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3TelephoneManagerTb4b4b4, Ta5d6ff"Ta5d6ffcodec2_availableTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.telephone_manager.RNS.DestinationTa5d6ff"Tb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3dest_clsTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3dest_clsTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffhash Tff7b72= Te6edf3destination_hash
Tff7b72await Te6edf3tmTff7b72.Td2a8ffinitiateTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3timeout_secondsTff7b72=T79c0ff1Tb4b4b4)
Tff7b72assert Te6edf3seenTb4b4b4[Ta5d6ff"Ta5d6ffprofileTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_LOW
Tff7b72assert Te6edf3seenTb4b4b4[Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffMODE_FULL_DUPLEX
Tff7b72def Td2a8fftest_init_telephone_stores_preferred_profile_not_idle_switchTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3cfg Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3cfgTff7b72.Td2a8fftelephone_enabledTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3cfgTff7b72.Td2a8fftelephone_audio_profile_idTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3ProfilesTff7b72.Td2a8ffQUALITY_MAX
Tff7b72with Te6edf3patchTb4b4b4(
Ta5d6ff"Ta5d6ffmeshchatx.src.backend.telephone_manager.TelephoneTa5d6ff"Tb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3telephone_clsTb4b4b4:
Te6edf3telephone Tff7b72= Te6edf3telephone_clsTff7b72.Td2a8ffreturn_value
Te6edf3manager Tff7b72= Te6edf3TelephoneManagerTb4b4b4(
Te6edf3identityTff7b72=Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3config_managerTff7b72=Te6edf3cfgTb4b4b4,
Te6edf3storage_dirTff7b72=Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3managerTff7b72.Td2a8ffinit_telephoneTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3managerTff7b72.Td2a8ffpreferred_profile_id Tff7b72== Te6edf3ProfilesTff7b72.Td2a8ffQUALITY_MAX
Te6edf3telephoneTff7b72.Td2a8ffswitch_profileTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_pycodec2_encode_decode_for_lxst_codec2_profilesTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""Live validation that Codec2 profiles used on Android calls actually work."""
Tff7b72import T7ee787numpy Tff7b72as T7ee787np
Tff7b72from T7ee787LXSTT7ee787.T7ee787Codecs Tff7b72import Te6edf3Codec2
Tff7b72assert Te6edf3TelephoneManagerTff7b72.Td2a8ffcodec2_availableTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72for Te6edf3pid Tff7b72in Tb4b4b4(
Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_ULTRA_LOWTb4b4b4,
Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_VERY_LOWTb4b4b4,
Te6edf3ProfilesTff7b72.Td2a8ffBANDWIDTH_LOWTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3codec Tff7b72= Te6edf3ProfilesTff7b72.Td2a8ffget_codecTb4b4b4(Te6edf3pidTb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3codecTb4b4b4, Te6edf3Codec2Tb4b4b4)
Te6edf3spf Tff7b72= Te6edf3codecTff7b72.Td2a8ffc2Tff7b72.Td2a8ffsamples_per_frameTb4b4b4(Tb4b4b4)
Te6edf3pcm Tff7b72= Tb4b4b4(T79c0ff0.1 Tff7b72* Te6edf3npTff7b72.Td2a8ffsinTb4b4b4(Te6edf3npTff7b72.Td2a8fflinspaceTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff8 Tff7b72* Te6edf3npTff7b72.Td2a8ffpiTb4b4b4, Te6edf3spfTb4b4b4)Tb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffastypeTb4b4b4(Te6edf3npTff7b72.Td2a8fffloat32Tb4b4b4)
Te6edf3pcm_i16 Tff7b72= Tb4b4b4(Te6edf3pcm Tff7b72* T79c0ff32767Tb4b4b4)Tff7b72.Td2a8ffastypeTb4b4b4(Te6edf3npTff7b72.Td2a8ffint16Tb4b4b4)
Te6edf3encoded Tff7b72= Te6edf3codecTff7b72.Td2a8ffc2Tff7b72.Td2a8ffencodeTb4b4b4(Te6edf3pcm_i16Tb4b4b4)
Te6edf3decoded Tff7b72= Te6edf3codecTff7b72.Td2a8ffc2Tff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3encodedTb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3encodedTb4b4b4) Tff7b72== Te6edf3codecTff7b72.Td2a8ffc2Tff7b72.Td2a8ffbytes_per_frameTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3decodedTb4b4b4) Tff7b72== Te6edf3spf
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────